# Настройка
Я знаю, что Вы чешетесь начать создавать игры, но нам нужно выполнить небольшую настройку.

## Настройка Rust
Все приложения Bevy и код движка написаны на Rust. Это значит, что перед тем, как начнём, нам нужно настроить наже рабочее окружение Rust.

### Установка Rust
Bevy в значительной степени опирается на улучшения в языке Rust и компиляторе. В минимальная поддерживаемая версия Rust (_Minimum Supported Rust Version_ — MSRV) является её «последней стабильной версией».

Установить Rust можно следуя [Rust Getting Started Guide](https://www.rust-lang.org/learn/get-started).

Когда всё закончено, вы должны иметь `rustc` компилятор и систему сборки `cargo` установленные в вашей переменной PATH.

### Установка зависимостей ОС

* [Linux](https://github.com/bevyengine/bevy/blob/main/docs/linux_dependencies.md)
* Windows: убедитесь, что установлена [VS2019 build tools](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16)
* MacOS: установите инструменты командной строки от Xcode с `xcode-select --install` или [Xcode app](https://apps.apple.com/en/app/xcode/id497799835)

### Редактор кода / Среда разработки (IDE)
Вы можете использовать любой редактор, какой пожелаете, но мы очень рекомендуем тот, который имеет плагин [rust-analyzer](https://github.com/rust-lang/rust-analyzer). Он до сих пор в разработке, но уже обеспечивает высший уровень автодополнения и код интеллект**(???)**. [Visual Studio Code](https://code.visualstudio.com/) имеет официальную поддержку [расширения rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer).

### Ресурсы по изучению Rust
Цель этой книги изучить Bevy, так что это не послужит полноценным обучением Rust. Если вы желаете изучить язык Rust, ознакомтесь со следующими ресурсами:

* [The Rust Book](https://doc.rust-lang.org/book/): лучшее место изучить Rust с нуля
* [Rust by Example](https://doc.rust-lang.org/rust-by-example/): изучите Rust работая с живыми примерами кода


## Создание нового проекта Bevy
Теперь мы готовы настроить проект Bevy! Bevy является обычной зависимостью от Rust. Вы можете добавить движок в уже существующий проект или создать новый. Для поноты мы предполагаем, что вы начинаете с нуля.

### Создание нового исполняемого проекта Rust
Сначала перейдите в папку, в которой хотите создать новый проект. Затем запустите следующую команду, чтобы создать новую папку, содержащую наш исполняемый проект на Rust:

```bash
cargo new my_bevy_game
cd my_bevy_game
```

Теперь введите `cargo run` чтобы собрать и запустить ваш проект. Вы должны увидеть вывод `Hello world!` в Ваш терминал. Откройте папку `my_bevy_game` в редакторе кода и потратье некоторое время на просмотре файлов.

`main.rs` является входной точукой вашей программы:

```rust
fn main() {
    println!("Hello, world!");
}
```

`Cargo.toml` является «файлом проекта». Он содержит в себе метаданные о проекте, как например, имя, зависимости и настройки сборки.

```toml
[package]
name = "my_bevy_game"
version = "0.1.0"
edition = "2021"

[dependencies]
```

### Добавление Bevy как зависимость
Bevy [доступен как библиотека на crates.io](https://crates.io/crates/bevy), официальном репозитории пакетов Rust.

Самый простой способ добавить его в Ваш проект, это использовать `cargo add`:

```bash
cargo add bevy
```

В качестве альтернативы, вы можете вручную добавить его в Cargo.toml, например так:

```toml
[package]
name = "my_bevy_game"
version = "0.1.0"
edition = "2021" # это должно быть 2021, или Вам нужно установить "resolver=2"

[dependencies]
bevy = "0.10" # убедитесь, что это последняя версия
```

Убедитесь, что используете последнюю упаковку `bevy`.

### Cargo Workspaces
Если используете [Cargo Workspaces](https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html), Вам также нужно добавить в resolver в Ваш файл Cargo.toml:

```toml
[workspace]
resolver = "2" # Важно! wgpu/Bevy это нужно!
```

### Компиляция с оптимизациями производительности
Хотя для простых проектов это может и не быть проблемой, отладочные сборки Rust могут быть _очень медленными_, особенно когда вы начинаете использовать Bevy для создания реальных игр.

Нередко при отладочных сборках с использованием конфигурации по умолчанию загрузка больших 3D-моделей занимает несколько минут, или частота кадров для простых сцен падает почти до неиграемого уровня.

К счастью, есть простое исправление, и нам не нужно отказываться от наших быстрых итеративных компиляций! Добавьте следующее в Ваш `Cargo.toml`:

```toml
# Включите небольшую оптимизацию в режиме отладки
[profile.dev]
opt-level = 1

# Включиты высокую оптимизацию для зависимостей (в том числе Bevy), но не для нашего кода:
[profile.dev.package."*"]
opt-level = 3
```

Вы можете считать, что проще разрабатывать в режиме релиза, но мы не рекомендуем этого делать, поскольку это может ухудшить процесс разработки, замедляя перекомпиляцию и отключая полезные (??debug symbols and assertions??).

### Включение быстрых компиляций(опционально)
Bevy можно просто отлично собрать, используя конфигурацию по умолчанию в стабильных версиях Rust. Однако, для макисмально быстрых итеративных компиляций, мы рекомендуем следующую конфигурацию:

* **Включите динамическую линковку Bevy**: Это самое значительное сокращение времени компиляции! Если `bevy` является зависимостью, то Вы можете скомпилировать двоичный файл с флагом функции "dynamic" (включает динамическую линковку). Обратите внимание, что на данный момент это не работает на Windows.

```bash
cargo run --features bevy/dynamic_linking
```

Если вы не хотите добавлять `--features bevy/dynamic_linking` перед каждым запуском, этот флаг может быть установлен перманентно через `Cargo.toml`:

```toml
[dependencies]
bevy = { version = "0.10.1", features = ["dynamic_linking"] }
```

> Внимание: Помните, что нужно убрать это перед тем, как релизнуть игру! В противном случае, вам нужно будет включить `libbevy_dylib` вместе с вашей игрой, если вы хотите, чтобы она запускалась. Если вы уберёте "dynamic" функцию, исполняемый файл вашей игры может запускаться автономно.

* **LLD компоновщик**: Компилятор Rust тратит много времени над этапом линковки. LLD _намного быстрее_ выполняет компоновку, чем обычный компоновщик Rust. Чтобы установить LDD, найдите свою операционную систему ниже и запустите указанную команду:

  * **Ubuntu**: `sudo apt-get install lld`
  * **Arch**: `sudo pacman -S lld`
  * **Windows**: Убедитесь, что у вас имеется последняя версия [cargo-binutils](https://github.com/rust-embedded/cargo-binutils)
    ```bash
    cargo install -f cargo-binutils
    rustup component add llvm-tools-preview
    ```

  * **MacOS**: Вы можете проследовать [этим инструкциям](https://lld.llvm.org/MachO/index.html), чтобы установить lld вручную или сделать это через brew: `brew install llvm`

* **Альтернатива — mold компоновщик**: mold в 5 раз быстрее, чем LLD, но с некоторыми оговорками, такими, как ограниченная поддержка платформы и случайные проблемы со стабильностью. Чтобы установить mold, найдите свою ОС ниже и запустите команды:

  * **Ubuntu**: `sudo apt-get install mold`
  * **Arch**: `sudo pacman -S mold`
  * **Windows**: mold до сих пор не поддерживает Windows. [См трекер проблем](https://github.com/rui314/mold/issues/190) для большей информации.
  * **MacOS**: mold и её также не поддерживает. [См трекер проблем](https://github.com/rui314/mold/issues/189).
  
  Вам также нужно будет добваить следующее в настройки Cargo в `YOUR_WORKSPACE/.cargo/config.toml`:
  ```toml
  [target.x86_64-unknown-linux-gnu]
  linker = "clang"
  rustflags = ["-C", "link-arg=-fuse-ld/usr/bin/mold"]
  ```

  > ЗАМЕТЬЕ: Отключение `bevy/dynamic` может улучшить производительность этого линковщика.
  
* **Ночные сборки компилятора Rust**: Это предоставит доступ к последним улучшениям производительности и «нестабильным» оптимизациям.

  Создайте файл `rust-toolchain.toml` в корне вашего проекта, рядом с `Cargo.toml`.
    ```toml
  [toolchain]
  channel = "nightly"
  ```

* **(??Generic Sharing??)**: Позволяет упаковкам совместно использовать мономорфизированный универсальный код вместо его дублирования. В некоторых случаях это позволяет нам «предварительно скомпилировать» общий код, чтобы это не влияло на итеративные компиляции. Это доступно только в nightly Rust.

Чтобы включить быстрые компиляции, установите ночной компилятор Rust и LLD. Затем скопируйте содержимое [этого файла](https://github.com/bevyengine/bevy/blob/main/.cargo/config_fast_builds) в `YOUR_WORKSPACE/.cargo/config.toml`. Для проекта в этом гайде это будет `my_bevy_game/.cargo/config.toml`.

Если что-то пошло не так, проверьте наши страницы [troubleshooting section](https://bevyengine.org/learn/book/troubleshooting/) или [попросите помощи в нашем Discord](https://discord.com/invite/gMUk5Ph).

## Сборка Bevy
Сейчас можно снова запустить `cargo run`. Зависимости Bevy начнут собираться. Это займёт какое-то время, поскольку вы, по сути, собираете движок с нуля. Вам нужно только один раз полностью собрать. Каждая следующая сборка будет быстрой!

Теперь у нас есть подготовленный проект Bevy, мы готовы начинать делать наше первое приложение Bevy!

[Next](01_Apps.md)
